package jdiy.sample.action;

import net.jdiy.core.*;

import java.util.HashMap;
import java.util.Map;


//产品相关Action
public class product extends JDiyAction {
    App app = App.get();//取得JDiy App上下文
    Dao dao = app.getDao(); //取得默认的数据库操作对象(DataAccessObject)

    //产品列表页Action（多条件综合过滤查询的示例）
    public void list() {
        initLeftNav(); //初始化左导航要循环输出的数据

        String id0 = app.get("id0");//获取产品大类别的ID
        String id1 = app.get("id1"); //获取产品小类别的ID

        String filter = "1=1";//随便写个为真的条件，以方便下面判断并添加 AND...的条件
        if (!"".equals(id0)) {
            filter = "EXISTS (SELECT 0 FROM series WHERE (id='" + id0 + "' OR tid='" + id0 + "') AND id=product.series_id) ";
            setAttr("series0", dao.rs(new Args("series", "id='" + id0 + "'")));
        }//如果有传大类ID过来，设置的filter条件将查询该大类下的所有产品.同时把大类查询出来方便页面（例如'您的位置'处）显示。

        if (!"".equals(id1)) {
            filter = "EXISTS (SELECT 0 FROM series WHERE (id='" + id1 + "' OR tid='" + id1 + "') AND id=product.series_id) ";
            setAttr("series1", dao.rs(new Args("series", "id='" + id1 + "'")));
        }//如果有小类ID过来，设置的filter条件将查询该小类下的所有产品.同时把小类查询出来方便页面（例如'您的位置'处）显示。

        String brand_id = app.get("brand_id");//获取品牌ID
        if (!"".equals(brand_id)) filter += " AND brand_id='" + brand_id + "'";//如果有选择品牌，就附加上品牌的过滤条件

        String size_id = app.get("size_id");//获取屏幕尺寸ID
        if (!"".equals(size_id)) filter += " AND size_id='" + size_id + "'";//如果有尺寸ID传过来，则附加上尺寸的过滤条件

        String disksize = app.get("disksize");//获取传过来的硬盘大小条件
        if (!"".equals(disksize)) filter += " AND disksize='" + disksize + "'";//有传过来，则附加上硬盘大小的条件过滤

        String memsize = app.get("memsize");
        //这个演示了内存大小是可以多选的噢（页面会把多个选项以|分隔隔后传过来。下面的语句将其拆分后，添加查询条件）
        if (!"".equals(memsize)) {
            String ft = "1=0"; //随便附加个为假的条件，以便下面多个关键字的 OR..连接
            String[] memArr = memsize.split("\\|");
            for (String key : memArr) {
                ft += " OR memsize='" + key + "'";
            }
            filter += " AND (" + ft + ")";
        }

        String exterior = app.get("exterior");
        //这个演示了外观特性是可以多选的（由于后台添加产品时，外观特性也是多选的，所以下面要用LIKE而不是等于）
        if (!"".equals(exterior)) {
            String ft = "1=0";
            String[] exArr = exterior.split("\\|");
            for (String key : exArr) {
                ft += " OR exterior LIKE '%" + key + "%'";
            }
            filter += " AND (" + ft + ")";
        }


        filter += " ORDER BY sort"; //最后添加排序方式

        Args a = new Args("product", filter);//构造Args查询对象
        Ls productLs = dao.ls(a);//执行查询

        setAttr("productLs", productLs);//把查询出的产品列表设置到请求流中，以便于jsp页面上输出显示

        forward("/WEB-INF/view/product/list.jsp"); //forward到展现层页面．即将request请求转交页面去输出。
    }

    //产品明细页显示的Action
    public void show(){
        initLeftNav();  //初始化左导航要循环输出的数据

        String productId=app.get("productId");//获取传过来的要显示的产品ID

        Rs rs = dao.rs(new Args("product p, size, brand",
                "p.id='"+productId+"' AND p.size_id=size.id AND p.brand_id=brand.id",
                "p.*, brand.name AS brandName, size.name AS sizeName"));
                //产品明细页要输出产品品牌和屏幕尺寸，所以这儿直接用内连接把要用到的字段都查询出来了
                //即，上面的Args查询条件对应的原生SQL语句为：
                // SELECT p.*, brand.name AS brandName, size.name AS sizeName FROM product p, size, brand WHERE p.id='XXX' AND p.size_id=size.id AND p.brand_id=brand.id
                //如果您对这种多表连接查询还不太熟悉，那您应该去补习一下SQL的基础知识，以便更好的理解JDiy的这种Args构造方法～～

        setAttr("product", rs);//将查询出的产品设置到请求流中（取名为product），以便在JSP页面输出。


        forward("/WEB-INF/view/product/show.jsp"); //forward到展现层页面．即将request请求转交页面去输出。
    }


    /**
     * 此方法查询出页面左导航的栏目内容，并设置到request请求中. 以便页面上输出
     */
    private void initLeftNav() {
        Map<String, Ls> subSeriesLsMap = new HashMap<String, Ls>();//用于存储产品小类（Map的键名是大类ID，键值是该大类对应的小类Ls列表）
        Args a = new Args("series");
        a.setCols("id, tid, t0");
        a.setFilter("tid='y0hg9bkpuh' AND isc=1 ORDER BY sort");
        //y0hg9bkpuh是产品中心的根节点（从后台的树型表结点管理中可以查询到节点的ID值）
        //查询这个根节点下的所有栏目（即产品大类），其中isc=1用于指定要查询的是“节点”而不是“内容”，详见JDiy官网上面建站平台教程中的有关树型节点表的文章。

        Ls seriesLs = dao.ls(a);//查询出产品大类
        for (Rs series : seriesLs.getItems()) { //for一下产品大类，分别查询出每个大类下对应的小类，并set到map中。
            a.setFilter("tid='" + series.get("id") + "' AND isc=1 ORDER BY sort");
            Ls subSeriesLs = dao.ls(a);
            subSeriesLsMap.put(series.get("id"), subSeriesLs);
        }

        //将产品大类和小类的信息设置到request请求流中，以便在jsp页面上输出
        setAttr("seriesLs", seriesLs);
        setAttr("subSeriesLsMap", subSeriesLsMap);

        //下面这两个是查询所有品牌和屏幕尺寸的Ls（用于产品页图片列表上方的条件过虑区的内容显示）
        setAttr("brandLs", dao.ls(new Args("brand", " ORDER BY sort")));
        setAttr("sizeLs", dao.ls(new Args("size", " ORDER BY sort")));
    }
}
